這個插件就如同名稱一樣,是專門寄信使用的(恩對,介紹就這樣而已)。
在開始使用之前要先做好前置準備,首先至少要有一個 SMTP Server,這邊使用 Google 提供的 SMTP Server,可以申請一個測試用的帳號,也可以使用自己的帳號。
不管用哪種帳號,建議是開啟兩階段驗證,並且使用應用程式密碼,這樣可以確保帳號安全(萬一哪天不小心被誰看到了這個程式,或是推上 github 之類的,被其他人看到密碼,相對來說比較安全)。
那要如何設定呢?在 Google 帳戶
裡面的安全性
-> 登入 Google
設定好兩階段驗證後,應該會看到 應用程式密碼
,像這樣:
然後直接點下去後,在 選取應用程式
中選擇 其他(自訂名稱)
。
隨便輸入一個名稱後,按下產生。
然後最後會出現一組隨機產生的 16 位的密碼(這邊我把它碼掉了,雖然不碼好像也不會出問題,但我還是習慣把它碼掉了),將它複製下來,等一下會用到,然後就結束了。
這邊開一個新的專案,然後按照慣例還是要使用 pip 安裝一下。
$ pipenv install Flask-Mail
安裝好了之後,就來建立一下架構吧。大概長這樣:
ithome_chatroom
├── templates
│ └── mail.html # 寄信首頁
├── app.py # 主要的檔案
├── config.py # 設定檔
├── Pipfile # 不管它,建立虛擬環境時自己會出現
└── Pipfile.lock # 不管它,安裝套件時自己會出現
首先要設定一下有關寄信的設定,比較主要要增加的設定就這幾個。
config.py
MAIL_SERVER = 'smtp.gmail.com' # 預設為 localhost
MAIL_PORT = 587 # 預設為 25
MAIL_USE_TLS = True # 預設為 False
MAIL_USERNAME = <你的 Gmail 帳號> # 預設為 None
MAIL_PASSWORD = <剛剛的複製的應用程式密碼> # 預設為 None
MAIL_DEFAULT_SENDER = MAIL_USERNAME # 預設為 None,這個不設也可以
再來就是比較主要的後端了。
app.py
from flask_mail import Mail, Message # 增加這行
import config
app = Flask(__name__)
app.config.from_object(config)
# 使用 flask_mail
mail = Mail(app)
@app.route('/mail', methods=['GET', 'POST'])
def send_mail():
if request.method == 'GET':
''' 瀏覽器送出需求要這個頁面時 '''
response = make_response(render_template('mail.html'))
elif request.method == 'POST':
''' 送出寄信 '''
# 收件人
recipient = request.values.get('recipient', None)
# 標題
title = request.values.get('title', '')
# 內容
content = request.values.get('content', '')
# 製作信件
msg = Message(title, recipients=[recipient])
msg.body = content
# 送出信件
mail.send(msg)
response = make_response('Success')
else:
response = make_response(redirect(url_for('send_mail')))
return response
if __name__ == "__main__":
app.run()
最後是可以寫信的前端頁面。
mail.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Mail test</title>
</head>
<body>
<h1>Hello</h1>
<h2>Mail test</h2>
<form action="/mail" method="POST">
<fieldset>
<legend>Send mail</legend>
<label>收件人</label><br />
<input type="email" name="recipient" required /><br />
<label>標題</label><br />
<input type="text" name="title" /><br />
<label>內容</label><br />
<input type="text" name="content" /><br />
<input type="submit" value="送出" />
</fieldset>
</form>
</body>
</html>
既然都寫完了,那就直接來看看結果吧,寫一封信寄給自己測試一下好了。
然後等它跑一下,你就會在自己的信箱看到自己寄給自己的信了。
那麼就大概這樣,寄信其實沒有什麼好說的,之所以還要講它一部分原因是因為這個功能意外的蠻常使用到的,另一部分原因後面會講到。
大家掰~掰~